package com.xuecheng.content.service.impl;

import com.xuecheng.content.mapper.CourseCategoryMapper;
import com.xuecheng.content.model.dto.CourseCategoryTreeDto;
import com.xuecheng.content.service.CourseCategoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * @Description: // 类说明，在创建类时要填写
 * @ClassName: CourseCategoryServiceImpl    // 类名，会自动填充
 * @Author: MYH          // 创建者
 * @Date: 2023/1/30 19:40   // 时间
 * @Version: 1.0     // 版本
 */
@Slf4j
@Service
public class CourseCategoryServiceImpl implements CourseCategoryService{

    @Resource
    private CourseCategoryMapper courseCategoryMapper;

    @Override
    public List<CourseCategoryTreeDto> queryTreeNodes(String id) {

        //得到了根节点下边的所有子节点
        List<CourseCategoryTreeDto> categoryTreeDtos = courseCategoryMapper.selectTreeNodes(id);

        //定义一个List作为最终返回的数据
        List<CourseCategoryTreeDto> courseCategoryTreeDtos = new ArrayList<>();
        //为了方便找子节点的父节点，定义一个map
        HashMap<String, CourseCategoryTreeDto> nodeMap = new HashMap<>();
        //将数据封装到List中，只包括了根节点的直接下属节点
        for (CourseCategoryTreeDto categoryTreeDto : categoryTreeDtos) {
            nodeMap.put(categoryTreeDto.getId(), categoryTreeDto);
            if (categoryTreeDto.getParentid().equals(id)) {
                courseCategoryTreeDtos.add(categoryTreeDto);
            } else {
                //找到子节点的父节点
                String parentid = categoryTreeDto.getParentid();
                CourseCategoryTreeDto parentNode = nodeMap.get(parentid);
                //将这些子节点放到父节点的childrenTreeNodes属性中
                if (parentNode != null) {
                    List<CourseCategoryTreeDto> childrenTreeNodes = parentNode.getChildrenTreeNodes();
                    if (childrenTreeNodes == null) {
                        parentNode.setChildrenTreeNodes(new ArrayList<>());
                    }
                    parentNode.getChildrenTreeNodes().add(categoryTreeDto);
                }
            }
        }

        //返回List中只包括了根节点的直接下属节点
        return courseCategoryTreeDtos;
    }
}
